package com.mo.sys.web.controller;

import com.mo.sys.pojo.SysNotice;
import com.mo.sys.service.SysNoticeService;
import com.mo.sys.web.pojo.JsonResult;
import com.mo.sys.web.util.PageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/*
此对象为公告模块控制层处理器对象
1.请求url，方式设计
  1-条件查询(请求方法-get，请求url-"/notice")
  2-新增公告(请求方法-post，请求url-"/notice")
  3-基于ID查询（请求方法-get，请求url-"/notice/{id}"）
  4-更新公告（请求方式-put，请求url-"/notice"）
  5-删除业务(请求方式-delete，请求url-"/notice/{id}")

2.请求参数设计
    2.1参数传递方式
        a.请求参数通过url传递
                    http://ip:port/?title=my&type=1
                    http://ip:port/10
        b.请求参数通过请求体传递
              {"title":"Study Spring Boot","Content":"Study ....",....}
     2.2参数接收方式
        a.直接量 （8种基本类型）
        b.pojo对象（需要提供和参数名对应的set方法）
        c.map对象（前提是必须用@RequestParam或@RequestBody注解对参数进行描述）

     2.3方法参数描述
        a.@PathVariable 用于获取请求url中{}内部的变量
        b.@RequestBody 用于获取请求体中json的格式的数据
        c.@RequestParam 用于获取非json格式的请求参数数据
        d.@DateTimeFormat 用于设置可以接收的日期格式字符串

3.响应标准设计（状态，消息，数据）：JsonResult
 */

//@ResponseBody+@Controller=@RestController

@RestController
@RequestMapping("/notice/")
public class SysNoticeController {

    @Autowired
    private SysNoticeService sysNoticeService;

   //05-删除业务
    /**
     * 基于Id删除业务
     * @param id
     * @return
     */
    @DeleteMapping("{id}")
     public JsonResult doDeleteNoticeById(@PathVariable Long...id){
         sysNoticeService.deleteById(id);
         return new JsonResult("delete ok");
     }

    //04-更新公告id

    /**
     * 更新公告信息
     *  param notice封装了公告信息的的参数对象
     * @return
     */
  @PutMapping
    public JsonResult doUpdateNotice(@RequestBody SysNotice  notice){ //Jason反序列化
        sysNoticeService.updateNotice(notice);
    return new JsonResult("update ok");
    }


   //03-基于ID查询
    /**url中允许使用变量，但这个变量需要使用{}括起来
     * 当我们在方法参数中需要这个变量的值时，可以使用@PathVariable对
     * 方法参数进行描述
     * 访问url: http://localhost/notice/1
     * @param id
     * @return
     */
    @GetMapping("{id}")
    public JsonResult doFindById(@PathVariable Long id){

        return new JsonResult(sysNoticeService.findById(id));
    }





    //02-新增公告
    /**
     * 新增公告信息
     * @param notice 封装客户端提交的通告信息，假如使用@RequestBody对参数
     * 进行描述，客户端可以向服务端传递json格式的字符串参数，服务端拿到字符串
     * 以后，会将json字符串转为参数类型的对象(这个过程还可以理解为json反序列化)
     *  注意：一个Controller方法中只能有一个参数使用@RequestBody注解进行描述
     * @return
     */
    @PostMapping
    public JsonResult doSaveNotice(@RequestBody SysNotice notice){//Json反系列化
        sysNoticeService.saveNotice(notice);
        return new JsonResult("save ok");//Json系列化
    }

   /*
     处理客户端的查询请求
    不带参数---请求url：htttp://localhost/notice/
    带参数---请求url:htttp://localhost/notice/?type=1&title=my
   */
    //01-条件查询
    @GetMapping
    public JsonResult doFindNotice(SysNotice sysNotice) {
        //   try {

        //分页查询简化形式 ---形式333最简版
        return new JsonResult(
                PageUtil.startPage().doSelectPageInfo(
                        () -> sysNoticeService.findNotices(sysNotice)));

    }
  /*
        //分页查询简化形式 ---形式222
        @GetMapping
        public JsonResult doFindNotice(SysNotice sysNotice){
        return new JsonResult(PageHelper.startPage(1,3)
        .doSelectPageInfo(()->//lambda表达式
                sysNoticeService.findNotices(sysNotice)
                ));
        }
       */

       /*
        //启动分页查询拦截----形式111
         @GetMapping
    public JsonResult doFindNotice(SysNotice sysNotice){
        PageInfo<SysNotice> pageInfo=
                PageHelper.startPage(1,3)
                        //执行查询
                .doSelectPageInfo(new ISelect() {
                    @Override
                    public void doSelect() {
                        sysNoticeService.findNotices(sysNotice);
                    }
                });
            return new JsonResult(pageInfo);
        */
    //    }catch (Exception e){
      //      return new JsonResult(e);
       // }
        //这个结果返回给--调用方法---(DispathcherServlet)
        // 方法调用方拿到方法执行结果以后会调用相关api将结果转换为json字符串
        //最后通过响应对象将字符串响应到客户端






}
